package AlgoritmosGeneticos.model.impl.corte;

import AlgoritmosGeneticos.model.AlgoritmoGenetico;
import AlgoritmosGeneticos.model.CondicionCorte;
import AlgoritmosGeneticos.model.Individuo;
import AlgoritmosGeneticos.model.Poblacion;
import AlgoritmosGeneticos.model.impl.PoblacionImpl;

public class CorteEntornoOptimo implements CondicionCorte{

	private int it;
	private double min;
	private double max;
	private int maxIterations;
	
	/**
	 * Condicion de corte de ciclo evolutivo de una poblacion.
	 * Se cumple mientras que ningún individuo se encuentre en
	 * un entorno dado al individuo más apto. 
	 *  
	 * @param optimo 	valor del mas apto
	 * @param entorno	entorno al mas apto
	 */
	public CorteEntornoOptimo(double optimo, double entorno) {
		System.out.println("Corte por entorno optimo");
		double temp=optimo+entorno;
		if((optimo - entorno) < temp){
			this.min=optimo-entorno;
			this.max=temp;
		}else{
			this.min=temp;
			this.max=optimo-entorno;
		}
		
	}
	
	@Override
	public boolean seCumple(Poblacion pob) {
		for(Individuo i: pob.getIndividuos()){
			double ap = 0;
			if(PoblacionImpl.fitness.equals(AlgoritmoGenetico.fitness.MINIMO)){
				ap = Math.sin(10*i.toNumber())*Math.exp(-i.toNumber()) + 4;
			}
			else
				ap=PoblacionImpl.aptitud(i);
			if( min <= ap && ap <= max || it > maxIterations)
				return false;
		}
		it++;
		return true;
	}

	@Override
	public void setMaxIterations(int iterations) {
		this.maxIterations=iterations;
	}

}
